package com.ssy.lingxi.component.redis.service;

import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

/**
 * 
 * IRedisCache缓存统一接口
 * @author jw.chen
 * @date 2020-08-01
 *
 */
@Service
public interface IRedisUtils {

    /**
     * 保存数据
     * @param key   key值
     * @param obj   value值
     * @param db_index   redis数据库下标
     * @return 缓存结果
     */
    Boolean set(String key, Object obj, Integer db_index);

    /**
     * 保存数据并设置超时时间
     * @param key    key值
     * @param obj    value值
     * @param expire 超时时间，单位 秒
     * @param db_index   redis数据库下标
     * @return 缓存结果
     */
    Boolean set(String key, Object obj, Long expire, Integer db_index);

    /**
     * 批量保存数据
     * @param keyValueList   key和value值
     * @param db_index   redis数据库下标
     * @return 缓存结果
     */
    List<Boolean> setBatch(Map<String, Object> keyValueList, Integer db_index);

    /**
     * 获取key对应的值
     * @param key   key值
     * @param db_index   redis数据库下标
     * @return 查询结果
     */
    Object get(String key, Integer db_index);

    /**
     * 获取key对应的实体对象
     * @param key key值
     * @param db_index redis数据库下标
     * @param clazz 实体类的Class
     * @param <T>   实体类
     * @return 查询结果
     */
    <T> T get(String key, Integer db_index, Class<T> clazz);

    /**
     * 批量获取key对应的值
     * @param keyList   key值
     * @param db_index   redis数据库下标
     * @return 查询结果
     */
    List<Object> getBatch(List<String> keyList, Integer db_index);

    /**
     * 删除指定的key
     * @param key 缓存的key
     * @param db_index redis数据库下标
     * @return 删除的数量
     */
    Long del(String key, Integer db_index);

    /**
     * 删除指定的key
     * @param keys  keys值
     * @param db_index   redis数据库下标
     * @return 删除的数量
     */
    Long del(List<String> keys, Integer db_index);

    /**
     * 以秒为单位，返回给定key的剩余生存时间
     * @param key   key值
     * @param db_index   redis数据库下标
     * @return 生存时间
     */
    Long ttl(String key, Integer db_index);

    /**
     * 以毫秒为单位，返回给定key的剩余生存时间
     * @param key   key值
     * @param db_index   redis数据库下标
     * @return 查询结果
     */
    Long pTtl(String key, Integer db_index);

    /**
     * 判断key是否存在
     * @param key   key值
     * @param db_index   redis数据库下标
     * @return 查询结果
     */
    Boolean exists(String key, Integer db_index);

    /**
     * 判断存在多少个key
     * @param keys   keys值
     * @param db_index   redis数据库下标
     * @return 查询结果
     */
    Long exists(List<String> keys, Integer db_index);

    /**
     * 查找所有符合给定模式pattern的key
     * @param key
     *      KEYS * 匹配数据库中所有 key 。
     *      KEYS h?llo 匹配 hello ， hallo 和 hxllo 等。
     *      KEYS h*llo 匹配 hllo 和 heeeeello 等。
     *      KEYS h[ae]llo 匹配 hello 和 hallo ，但不匹配 hillo
     * @param db_index   redis数据库下标
     * @return 查询结果
     */
    List<Object> searchKey(String key, Integer db_index);

    /**
     * 查找所有符合给定模式pattern的key个数
     * @param key
     *      KEYS * 匹配数据库中所有 key 。
     *      KEYS h?llo 匹配 hello ， hallo 和 hxllo 等。
     *      KEYS h*llo 匹配 hllo 和 heeeeello 等。
     *      KEYS h[ae]llo 匹配 hello 和 hallo ，但不匹配 hillo
     * @param db_index   redis数据库下标
     * @return 查询结果
     */
    int size(String key, Integer db_index);

    /**
     * 递增1
     * @param key key值
     * @param db_index   redis数据库下标
     * @return 缓存结果
     */
    Long increment(String key, Integer db_index);

    /**
     * 递增
     * @param key key值
     * @param data 累加值
     * @param db_index   redis数据库下标
     * @return  缓存结果
     */
    Long increment(String key, long data, Integer db_index);

    /**
     * 递增
     * @param key key值
     * @param data 累加值
     * @param db_index   redis数据库下标
     * @return  缓存结果
     */
    Double increment(String key, double data, Integer db_index);

    /**
     * 递减1
     * @param key key值
     * @param db_index   redis数据库下标
     * @return  缓存结果
     */
    Long decrement(String key, Integer db_index);

    /**
     * 递减
     * @param key key值
     * @param data 累加值
     * @param db_index   redis数据库下标
     * @return  缓存结果
     */
    Long decrement(String key, long data, Integer db_index);

    /**
     * 保存数据
     * @param key   key值
     * @param field   field值
     * @param obj   value值
     * @param db_index   redis数据库下标
     * @return 缓存结果
     */
    Boolean hSet(String key, String field, Object obj, Integer db_index);

    /**
     * 保存数据并设置超时时间
     * @param key    key值
     * @param field   field值
     * @param obj    value值
     * @param expire 超时时间，单位 秒
     * @param db_index   redis数据库下标
     * @return 缓存结果
     */
    Boolean hSet(String key, String field, Object obj, Long expire, Integer db_index);

    /**
     * 获取key对应的值
     * @param key   key值
     * @param field   field值
     * @param db_index   redis数据库下标
     * @return 查询结果
     */
    Object hGet(String key, String field, Integer db_index);

    /**
     * 保存数据
     * @param key   key值
     * @param value   value值
     * @param db_index   redis数据库下标
     * @return 缓存结果
     */
    Boolean hMSet(String key, Map<String, String> value, Integer db_index);

    /**
     * 保存数据并设置超时时间
     * @param key    key值
     * @param value    value值
     * @param expire 超时时间，单位 秒
     * @param db_index   redis数据库下标
     * @return 缓存结果
     */
    Boolean hMSet(String key, Map<String, String> value, Long expire, Integer db_index);

    /**
     * 获取key对应的值
     * @param key   key值
     * @param fields   fields值
     * @param db_index   redis数据库下标
     * @return 查询结果
     */
    List<Object> hMGet(String key, String[] fields, Integer db_index);

    /**
     * 获取key对应的值
     * @param key   key值
     * @param field   field值
     * @param db_index   redis数据库下标
     * @return 查询结果
     */
    Object hMGet(String key, String field, Integer db_index);

    /**
     * 获取key对应的值
     * @param key   key值
     * @param db_index   redis数据库下标
     * @return 查询结果
     */
    Map<String, Object> hGetAll(String key, Integer db_index);

    /**
     * 删除指定的key
     * @param key  key值
     * @param field   field值
     * @param db_index   redis数据库下标
     * @return 删除的数量
     */
    Long hDel(String key, String field, Integer db_index);

    /**
     * 删除指定的key
     * @param key  key值
     * @param fields  keys值
     * @param db_index   redis数据库下标
     * @return 删除的数量
     */
    Long hDel(String key, List<String> fields, Integer db_index);

    /**
     * 判断key是否存在
     * @param key   key值
     * @param field   field值
     * @param db_index   redis数据库下标
     * @return 查询结果
     */
    Boolean hExists(String key, String field, Integer db_index);

    /**
     * 判断存在多少个fields
     * @param key   key值
     * @param fields   fields值
     * @param db_index   redis数据库下标
     * @return 查询结果
     */
    Long hExists(String key, List<String> fields, Integer db_index);

    /**
     * 查找所有符合给定模式pattern的key中的所有field
     * @param key key值
     * @param db_index   redis数据库下标
     * @return 查询结果
     */
    List<Object> searchHKey(String key, Integer db_index);

    /**
     * 查找所有符合给定模式pattern的key中的所有field个数
     * @param key key值
     * @param db_index   redis数据库下标
     * @return 查询结果
     */
    int hSize(String key, Integer db_index);

    /**
     * 递增1
     * @param key key值
     * @param field   field值
     * @param db_index   redis数据库下标
     * @return  缓存结果
     */
    Long hIncrement(String key, String field, Integer db_index);

    /**
     * 递增
     * @param key key值
     * @param field   field值
     * @param data 累加值
     * @param db_index   redis数据库下标
     * @return  缓存结果
     */
    Long hIncrement(String key, String field, long data, Integer db_index);

    /**
     * 递增
     * @param key key值
     * @param field   field值
     * @param data 累加值
     * @param db_index   redis数据库下标
     * @return 缓存结果
     */
    Double hIncrement(String key, String field, double data, Integer db_index);

    /**
     * 递减1
     * @param key key值
     * @param field   field值
     * @param db_index   redis数据库下标
     * @return 缓存结果
     */
    Long hDecrement(String key, String field, Integer db_index);

    /**
     * 递减
     * @param key key值
     * @param field   field值
     * @param data 累加值
     * @param db_index   redis数据库下标
     * @return 缓存结果
     */
    Long hDecrement(String key, String field, long data, Integer db_index);
}
